package com.example.demo.service.impl;

import com.example.demo.service.FileParserService;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.util.List;

/**
 * 文件解析服务实现类
 * 提供PDF和DOCX文件的解析功能
 */
@Service
public class FileParserServiceImpl implements FileParserService {

    // 支持的文件类型
    private static final String PDF_CONTENT_TYPE = "application/pdf";
    private static final String DOCX_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

    @Override
    public String parseFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return "";
        }

        String contentType = file.getContentType();
        if (contentType == null) {
            return "文件类型未知: " + file.getOriginalFilename();
        }

        try {
            if (PDF_CONTENT_TYPE.equals(contentType)) {
                return parsePDFFile(file.getInputStream());
            } else if (DOCX_CONTENT_TYPE.equals(contentType)) {
                return parseDOCXFile(file.getInputStream());
            } else {
                // 对于不支持的文件类型，返回文件名信息
                return "不支持的文件类型: " + file.getOriginalFilename();
            }
        } catch (IOException e) {
            // 记录错误日志
            System.err.println("文件解析错误: " + e.getMessage());
            return "文件解析失败: " + file.getOriginalFilename() + " (" + e.getMessage() + ")";
        }
    }

    @Override
    public boolean isSupportedFileType(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return false;
        }

        String contentType = file.getContentType();
        // 直接使用contentType进行文件类型检测
        return contentType != null && 
               (PDF_CONTENT_TYPE.equals(contentType) || 
                DOCX_CONTENT_TYPE.equals(contentType));
    }

    @Override
    public String parseFile(File file) {
        if (file == null || !file.exists() || !file.isFile()) {
            return "文件不存在或不是有效文件";
        }

        String fileName = file.getName().toLowerCase();
        
        try {
            if (fileName.endsWith(".pdf")) {
                return parsePDFFile(new FileInputStream(file));
            } else if (fileName.endsWith(".docx")) {
                return parseDOCXFile(new FileInputStream(file));
            } else {
                // 对于不支持的文件类型，返回文件名信息
                return "不支持的文件类型: " + file.getName();
            }
        } catch (IOException e) {
            // 记录错误日志
            System.err.println("文件解析错误: " + e.getMessage());
            return "文件解析失败: " + file.getName() + " (" + e.getMessage() + ")";
        }
    }

    /**
     * 解析PDF文件
     */
    private String parsePDFFile(InputStream inputStream) throws IOException {
        StringBuilder textBuilder = new StringBuilder();
        try (PDDocument document = PDDocument.load(inputStream)) {
            PDFTextStripper stripper = new PDFTextStripper();
            // 设置开始和结束页（全页解析）
            stripper.setStartPage(1);
            stripper.setEndPage(document.getNumberOfPages());
            // 获取文本内容
            textBuilder.append(stripper.getText(document));
        }
        return textBuilder.toString();
    }

    /**
     * 解析DOCX文件
     */
    private String parseDOCXFile(InputStream inputStream) throws IOException {
        StringBuilder textBuilder = new StringBuilder();
        try (XWPFDocument document = new XWPFDocument(inputStream)) {
            List<XWPFParagraph> paragraphs = document.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
                String text = paragraph.getText();
                if (text != null && !text.trim().isEmpty()) {
                    textBuilder.append(text).append("\n");
                }
            }
        }
        return textBuilder.toString();
    }
}